package com.zheng.springcloud.controller;

import com.netflix.hystrix.contrib.javanica.annotation.HystrixCollapser;
import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
import com.netflix.hystrix.contrib.javanica.annotation.HystrixProperty;
import com.netflix.ribbon.proxy.annotation.Hystrix;
import com.zheng.springcloud.pojo.Dept;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.netflix.hystrix.EnableHystrix;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;

/**
 * @author lenovo
 * 在这里我们就只管调用，不用再去关心其中的Service层的具体实现
 * 在这里我们可以引入一个{@link org.springframework.web.client.RestTemplate}类
 * 它可以方便我们进行Rest连接，里面包含了很多的方法，get post head……提交方法
 * <B>但我们需要注意的是,在这个类中我们没有对他进行Bean的注册，我们需要手动进行注册Bean<B/>
 */
@RestController
public class DeptConsumerDeptController {

    /**
     * 这里我们的服务地址就不能固定了，我们可以根据服务名来进行服务定位
     * ~private final String REST_URL_PREFIX = "http://localhost:8001";~
     * 想下面这样，由于我们整合了Eureka和Ribbon，在这里可以直接通过服务来进行定位，
     * 而不用关系服务IP地址
     * */
    private final String REST_URL_PREFIX = "http://provider-dept";

    @Autowired
    private RestTemplate restTemplate;

    @RequestMapping("/consumer/dept/list")
    @HystrixCommand(fallbackMethod = "hystrixSelect")
    public ArrayList<Dept> select(){
        return restTemplate.getForObject(REST_URL_PREFIX+"/dept/list",ArrayList.class);
    }

    @RequestMapping("/consumer/dept/add")
    @HystrixCommand(fallbackMethod = "hystrixAddDept")
    public boolean addDept(Dept dept){
        HashMap<String, Object> map = new HashMap<>(2);
        System.out.println(dept);
//        在这里我不能直接传递Dept这个对象！
        map.put("deptName",dept.getDeptName());
        return restTemplate.getForObject(REST_URL_PREFIX+"/dept/add?deptName={deptName}",Boolean.class,map);
    }

    @RequestMapping("/consumer/dept/get/{id}")
    @HystrixCommand(fallbackMethod = "hystrixGet")
    public Dept get(@PathVariable("id")int id){
        return restTemplate.getForObject(REST_URL_PREFIX+"/dept/get/"+id,Dept.class);
    }

    public boolean hystrixAddDept(Dept dept) {
        return false;
    }

    public Dept hystrixGet(int id) {
        return new Dept().setDeptId(-1).setDeptName("服务器繁忙，请稍候重试！").setDeptDatabase("数据库繁忙！");
    }

    public ArrayList<Dept> hystrixSelect() {
        ArrayList<Dept> list = new ArrayList<>();
        list.add(new Dept().setDeptId(-1).setDeptName("服务器繁忙，请稍候重试！").setDeptDatabase("数据库繁忙！"));
        return list;
    }
}
